package demo1;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * 创建代理对象的工具类
 */
public class ProxyStudyUtil {
    public static <T> T crateProxy(T t){
        return (T)Proxy.newProxyInstance(
                // 第一个参数指定类加载器加载并实例化代理对象
                ProxyStudyUtil.class.getClassLoader(),
                // 第二个参数指定代理对象需要实现的接口
                t.getClass().getInterfaces(),
                // 第三参数指定代理对象要在执行的任务
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        // 第一个参数代表代理对象本身
                        // 第二个参数代表被代理对象的方法
                        // 第三参数代码白代理对象方法的参数

                        // 判断执行的方法
                        String name = method.getName();
                        if("sing".equals(name)){
                            System.out.println("代理对象已经安排好唱歌时间，收到80万元！");
                        } else if("dance".equals(name)){
                            System.out.println("代理对象已经安排海跳舞场地，收到100万元！");
                        }
                        return method.invoke(t,args);
                    }
                }
        );

    }

    public static <T> T crateProxy2(T t){
        return (T)Proxy.newProxyInstance(
                // 第一个参数指定类加载器加载并实例化代理对象
                ProxyStudyUtil.class.getClassLoader(),
                // 第二个参数指定代理对象需要实现的接口
                t.getClass().getInterfaces(),
                // 第三参数指定代理对象要在执行的任务
                (proxy, method, args) -> {
                    // 第一个参数代表代理对象本身
                    // 第二个参数代表被代理对象的方法
                    // 第三参数代码白代理对象方法的参数

                    // 判断执行的方法
                    String name = method.getName();
                    if("sing".equals(name)){
                        System.out.println("代理对象已经安排好唱歌时间，收到80万元！");
                    } else if("dance".equals(name)){
                        System.out.println("代理对象已经安排海跳舞场地，收到100万元！");
                    }
                    return method.invoke(t,args);
                }
        );

    }
}
